package initialize

import (
	"fmt"
	"github.com/natefinch/lumberjack"
	"go.uber.org/zap"
	"go.uber.org/zap/zapcore"
	"time"
)

// 创建一个 lumberjack.Logger 配置
func newLumberjackLogger(filename string) zapcore.WriteSyncer {
	return zapcore.AddSync(&lumberjack.Logger{
		Filename:   filename, // 日志文件路径
		MaxSize:    10,       // MB
		MaxBackups: 3,        // 保留最多 3 个备份
		MaxAge:     28,       // 保留 28 天
		Compress:   true,     // 启用压缩
	})
}

// 本地使用的Logger
func InitLogger3() {
	logger, _ := zap.NewDevelopment()
	zap.ReplaceGlobals(logger)
}

func InitLogger2() {
	//logger, _ := zap.NewProduction()
	//zap.ReplaceGlobals(logger)
	dateDir := time.Now().Format("20060102")
	// 创建 info 级别的日志输出（info.log）
	infoFile := newLumberjackLogger(fmt.Sprintf("./go_logs/user_srv/%s/info.log", dateDir))
	// 创建 error 级别的日志输出（error.log）
	errorFile := newLumberjackLogger(fmt.Sprintf("./go_logs/user_srv/%s/error.log", dateDir))

	// 创建 encoder
	encoder := zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig())

	infoLevel := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool {
		return lvl == zapcore.InfoLevel // 只启用 Info 级别
	})

	// 创建一个自定义的 zap 配置，指定文件输出
	infoCore := zapcore.NewCore(
		encoder,
		zapcore.AddSync(infoFile), // 输出到 info.log
		infoLevel,                 // 只记录 info 级别及以上的日志
	)

	// 创建 error 级别的日志输出
	errorCore := zapcore.NewCore(
		encoder,
		zapcore.AddSync(errorFile), // 输出到 error.log
		zapcore.WarnLevel,          // 记录 error 级别及以上的日志
	)

	// 合并 info 和 error 两个 Core
	multiCore := zapcore.NewTee(infoCore, errorCore)
	// 创建日志记录器
	logger := zap.New(multiCore, zap.AddCaller())

	//logger, _ := zap.NewProduction()
	zap.ReplaceGlobals(logger)
}

func InitLogger() {
	//logger, _ := zap.NewProduction()
	//zap.ReplaceGlobals(logger)
	dateDir := time.Now().Format("20060102")
	// 创建 info 级别的日志输出（info.log）
	infoFile := newLumberjackLogger(fmt.Sprintf("/www/go_logs/user_srv/%s/info.log", dateDir))
	// 创建 error 级别的日志输出（error.log）
	errorFile := newLumberjackLogger(fmt.Sprintf("/www/go_logs/user_srv/%s/error.log", dateDir))

	// 创建 encoder
	encoder := zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig())

	infoLevel := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool {
		return lvl == zapcore.InfoLevel // 只启用 Info 级别
	})

	// 创建一个自定义的 zap 配置，指定文件输出
	infoCore := zapcore.NewCore(
		encoder,
		zapcore.AddSync(infoFile), // 输出到 info.log
		infoLevel,                 // 只记录 info 级别及以上的日志
	)

	// 创建 error 级别的日志输出
	errorCore := zapcore.NewCore(
		encoder,
		zapcore.AddSync(errorFile), // 输出到 error.log
		zapcore.WarnLevel,          // 记录 error 级别及以上的日志
	)

	// 合并 info 和 error 两个 Core
	multiCore := zapcore.NewTee(infoCore, errorCore)
	// 创建日志记录器
	logger := zap.New(multiCore, zap.AddCaller())

	//logger, _ := zap.NewProduction()
	zap.ReplaceGlobals(logger)
}
